//package com.awenhui.demo.config;
//
//import com.google.common.base.Predicate;
//import com.google.common.base.Predicates;
//import io.swagger.annotations.ApiOperation;
//import lombok.RequiredArgsConstructor;
//import org.apache.commons.lang3.ArrayUtils;
//import org.apache.commons.lang3.StringUtils;
//import org.springframework.beans.factory.support.DefaultListableBeanFactory;
//import org.springframework.context.ApplicationContext;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.web.method.HandlerMethod;
//import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
//import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
//import springfox.documentation.RequestHandler;
//import springfox.documentation.builders.ApiInfoBuilder;
//import springfox.documentation.builders.ParameterBuilder;
//import springfox.documentation.builders.PathSelectors;
//import springfox.documentation.builders.RequestHandlerSelectors;
//import springfox.documentation.schema.ModelRef;
//import springfox.documentation.service.ApiInfo;
//import springfox.documentation.service.Contact;
//import springfox.documentation.service.Parameter;
//import springfox.documentation.spi.DocumentationType;
//import springfox.documentation.spring.web.plugins.Docket;
//import springfox.documentation.swagger2.annotations.EnableSwagger2;
//
//import java.util.*;
//
///**
// * Swagger配置
// *
// * @author yuxf on 2020/4/10 11:19
// * @version 1.0
// */
//@Configuration
//@EnableSwagger2
//@RequiredArgsConstructor
//public class SwaggerConfig {
//
//    final ApplicationContext applicationContext;
//
//    /**
//     * 所有api分组信息
//     *
//     * @return Docket ${@link Docket}
//     * @author zxiaozhou
//     * @date 2020-07-06 18:52
//     */
//    @Bean
//    public Docket allGroup() {
//        return new Docket(DocumentationType.SWAGGER_2)
//                .apiInfo(apiInfo("all"))
//                .groupName("all")
//                .select()
//                .apis(input -> matchVersion(input, null))
//                .paths(PathSelectors.any())
//                .build();
//    }
//
//    /**
//     * 匹配swagger版本
//     *
//     * @param input   ${@link String} 注解解析
//     * @param version ${@link String} 版本信息
//     * @return String[] ${@link String[]}
//     * @author zxiaozhou
//     * @date 2020-07-06 18:49
//     */
//    protected static boolean matchVersion(RequestHandler input, String version) {
//        if (StringUtils.isBlank(version) ) {
//            return true;
//        }
//        String[] versions = getVersions(input);
//        for (String v : versions) {
//            if (version.equalsIgnoreCase(v)) {
//                return true;
//            }
//        }
//        return false;
//    }
//
//
//    /**
//     * 其他api分组信息
//     *
//     * @author zxiaozhou
//     * @date 2020-07-06 18:52
//     */
//    @Bean
//    public void otherGroups() {
//        Map<String, String> versions = new HashMap<>(4);
//        Map<RequestMappingInfo, HandlerMethod> handlerMethodMap = applicationContext.getBean(RequestMappingHandlerMapping.class).getHandlerMethods();
//        for (Map.Entry<RequestMappingInfo, HandlerMethod> infoEntry : handlerMethodMap.entrySet()) {
//            HandlerMethod handlerMethod = infoEntry.getValue();
//            ApiOperation apiOperation = handlerMethod.getMethodAnnotation(ApiOperation.class);
//            if (Objects.nonNull(apiOperation)) {
//                String value = apiOperation.value();
//                if (StringUtils.isNotBlank(apiOperation.value())) {
//                    String[] versionInfos = getVersions(value);
//                    if (ArrayUtils.getLength(versionInfos) > 0) {
//                        for (String versionInfo : versionInfos) {
//                            versions.put(versionInfo.replace(".", ""), versionInfo);
//                        }
//                    }
//                }
//            }
//        }
//        DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) applicationContext.getAutowireCapableBeanFactory();
//        for (Map.Entry<String, String> version : versions.entrySet()) {
//            Docket docket = api(version.getValue());
//            defaultListableBeanFactory.registerSingleton(version.getKey(), docket);
//        }
//    }
//
//
//
//    /**
//     * 获取版本信息
//     *
//     * @param input ${@link RequestHandler}
//     * @return String[] ${@link String[]}
//     * @author zxiaozhou
//     * @date 2020-07-06 18:11
//     */
//    protected static String[] getVersions(RequestHandler input) {
//        if (Objects.isNull(input) ) {
//            return new String[]{};
//        }
//        com.google.common.base.Optional<ApiOperation> methodAnnotation = input.findAnnotation(ApiOperation.class);
//        if (methodAnnotation.isPresent()) {
//            ApiOperation apiOperation = methodAnnotation.get();
//            return getVersions(apiOperation.value());
//
//        }
//        return new String[]{};
//    }
//
//
//    /**
//     * 解析版本信息
//     *
//     * @param version ${@link String}
//     * @return String[] ${@link String[]}
//     * @author zxiaozhou
//     * @date 2020-07-06 18:02
//     */
//    private static String[] getVersions(String version) {
//        String reg = "(.)*(@[\\(（].*[\\)）])(.)*";
//        if (version.matches(reg)) {
//            version = version.replaceAll(reg, "$2");
//            reg = "(@[\\(（])(.*)([\\)）])";
//            version = version.replaceAll(reg, "$2");
//            return version.split("[,，]");
//        }
//        return new String[]{};
//    }
//
//
//
//    public Docket api(String version) {
//        List<Parameter> parameters = new ArrayList<>();
//        parameters.add(new ParameterBuilder()
//                .name("token")
//                .description("认证token")
//                .modelRef(new ModelRef("string"))
//                .parameterType("header")
//                .required(false)
//                .build());
//        return new Docket(DocumentationType.SWAGGER_2)
//                .apiInfo(apiInfo(version))
//                .groupName(version)
//                .globalOperationParameters(parameters)//统一添加token参数
//                .select()
//                .apis(RequestHandlerSelectors.any())
//                .paths(paths())
//                .build();
//
//    }
//
//
//
//    private ApiInfo apiInfo(String version) {
//        return new ApiInfoBuilder()
//                .title("二手房资金监管系统APIs")
//                .description("这个页面列出了所有有关此App相关的接口.")
//                .contact(new Contact("yuxf","","yuxin5156@163.com"))
//                .version(version)
//                .build();
//    }
//
//    private Predicate<String> paths() {
//        // Match all paths except /error
//        return Predicates.and(
//                PathSelectors.regex("/.*"),
//                Predicates.not(PathSelectors.regex("/error.*"))
//        );
//    }
//}
